package com.hmdp.utils;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

@Component
public class RedisIdWorker {
    private static final long BEGIN_TIMESTAMP = 1704067200L;

    private StringRedisTemplate stringRedisTemplate;

    /**
     * 序列号的移动位数
     */
    private static final int COUNT_BITS=32;

    public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    public long nextId(String keyPrefix) {
        //1.生成时间戳（使用当前日期减去一个固定日期——用秒做单位）
        LocalDateTime localDateTime = LocalDateTime.now();
        long nowSecond = localDateTime.toEpochSecond(ZoneOffset.UTC);
        long now = nowSecond-BEGIN_TIMESTAMP;
        //2.生成序列号
        //2.1将获取到的当前时间转换，精确到天
        String date = localDateTime.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
        //2.2自增长
        long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + date);
        //3.拼接
        //把时间戳挪到高位，序号塞进低位，合成一个不重复的 64 位分布式 ID
        return now << COUNT_BITS | count;

    }

    public static void main(String[] args) {
        //用 年、月、日、时、分、秒 这 6 个参数，构造一个 不带时区 的日期时间对象：2024-01-01 00:00:00
        LocalDateTime localDateTime = LocalDateTime.of(2024, 1, 1, 0, 0, 0);
        //把刚才的 LocalDateTime 按 UTC 时区 转换成 Unix 时间戳（秒）
        long epochSecond = localDateTime.toEpochSecond(ZoneOffset.UTC);
        System.out.println(epochSecond);
    }
}
